package com.ly.algorithm.leetcode.slide;

import java.util.HashSet;
import java.util.Set;

/**
 * @Classname Problem3
 * @Description
 *
 * 示例 1:
 *
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 示例 2:
 *
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 示例 3:
 *
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 * 示例 4:
 *
 * 输入: s = ""
 * 输出: 0
 *
 *
 * @Date 2020/12/21 22:06
 * @Author 冷心影翼
 */
public class Problem3 {

	public static void main(String[] args) {
		Solution3 solution3 = new Solution3();
		System.out.println(solution3.lengthOfLongestSubstring("pwwkew"));
	}
}


class Solution3 {
	public int lengthOfLongestSubstring(String s) {
		Set<Character> set  = new HashSet<>();
		char[] chars = s.toCharArray();
		int r = -1,ans = 0;
		//pwwkewv
		for(int i=0;i<chars.length;i++) {
			//i=2   //i = 3 kew
			if(i != 0) {
				set.remove(s.charAt(i-1));
			}
			//p        pw       //w     //w     //wk        //wke       //wke
			//r = 0    r = 1      r=1      r=2    r = 3        r=4
			while (r+1 < chars.length && !set.contains(chars[r+1])) {
				set.add(chars[r+1]);
				r++;
			}
			// 2
			ans = Math.max(ans,r-i+1);
		}
		return ans;
	}
}